package com.whz.governance.sensitive.engine;

import cn.hutool.core.collection.CollUtil;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;

import java.nio.charset.Charset;
import java.util.List;

/**
 * 布隆过滤器实现的白名单,验证关键词是否在白名单中,默认错误率3%
 *
 * @author whz
 */
public class WhiteWordsBloomFilter {

    private final BloomFilter<String> bloomFilter;

    /**
     * 初始化布隆顾虑器,容许的存在性错误率3%
     *
     * @param words 白名单列表
     */
    public WhiteWordsBloomFilter(List<String> words) {
        this(words, 0.03f);
    }

    /**
     * 初始化布隆顾虑器
     *
     * @param words 白名单列表
     * @param fpp   容许的存在性错误率
     */
    public WhiteWordsBloomFilter(List<String> words, double fpp) {
        if (CollUtil.isEmpty(words)) {
            throw new RuntimeException("words must not empty.");
        }

        bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()),
                                         words.size(), fpp);
        words.forEach(bloomFilter::put);
    }

    /**
     * 估算word是否在白名单中,存在性有3%错误率,不存在100%正确
     *
     * @param word 关键词
     * @return true 3%概率存在,false 100%概率不存在
     */
    public boolean match(String word) {
        return bloomFilter.test(word);
    }

}